package com.gradumate.server.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;

import com.gradumate.server.PMF;
import com.gradumate.shared.Gebruiker;

/**
 * Klasse die communiceert met de datastore van Google 
 * @author IJsbrand
 *
 */
public class Gebruiker_DAO {

	private final Logger log = Logger.getLogger(Gebruiker_DAO.class.getName());

	/**
	 * Haalt een Gebruiker op a.d.v zjn e-mail
	 * 
	 * @param String
	 *            email van de Gebruiker
	 * @return gevonden Gebruiker object
	 */
	@SuppressWarnings("unchecked")
	public Gebruiker getGebruikerByEmail(String email) {

		if (email == null) {
			return null;
		}

		Gebruiker g = null;

		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName() + " WHERE gebruikerEmail == \"" + email + "\"";
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();

		if (gebruikers != null && !gebruikers.isEmpty()) {
			g = gebruikers.get(0);
			log.info("getGebruikerByEmail(" + email + ") | Gebruiker: " + g.toString());
		} else {
			System.out.println("Gebruiker met " + email + " levert niets op.");
		}

		log.info("getGebruikerByEmail(" + email + ")");

		return g;
	}

	/**
	 * Haalt een gebruiker op a.d.v zijn e-mail adres
	 * 
	 * @param Gebruiker
	 *            g
	 * @return of er geen bestaande Gebruiker is gevonden
	 */
	public boolean addGebruiker(Gebruiker g) {
		Gebruiker gebruiker = getGebruikerByEmail(g.getGebruikerEmail());
		if (gebruiker == null) {
			PersistenceManager pmWrite = PMF.get().getPersistenceManager();
			try {
				pmWrite.makePersistent(g);
			} finally {
				pmWrite.close();
			} 
		} 

		log.info("addGebruiker(" + g.toString() + ") | Gebruiker: " + g.toString());

		return gebruiker == null;
	}

	/**
	 * Update een Gebruiker object
	 * 
	 * @param Gebruiker
	 *            het gebruiker object die geupdate word
	 * @return Gebruiker object die ontvangen is
	 */
	public Gebruiker updateGebruiker(Gebruiker g) {
		Gebruiker gebruiker = getGebruikerByEmail(g.getGebruikerEmail());
		if (gebruiker.getClass() == Gebruiker.class) {
			PersistenceManager pmWrite = PMF.get().getPersistenceManager();
			try {
				pmWrite.makePersistent(g);
			} finally {
				pmWrite.close();
			}
		}

		log.info("updateGebruiker(" + g.toString() + ") | Gebruiker: " + g.toString());

		return g;
	}
	
	/**
	 * Haalt een lijst van alle Gebruiker objecten op
	 * 
	 * @return List met Gebruiker objecten
	 */
	@SuppressWarnings("unchecked")
	public ArrayList<Gebruiker> getGebruikers() {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName();
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();

		log.info("getGebruikers() | Gebruikers: " + gebruikers);

		return gebruikers;
	}

	/**
	 * Haalt Gebruikers op a.d.v type
	 * 
	 * @param Integer
	 *            met Gebruiker type
	 * @return Gebruiker objecten met het opgeven type
	 */
	public ArrayList<Gebruiker> getGebruikerByType(int type) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName() + " WHERE type == " + type;
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();

		log.info("getGebruikerByType(" + type + ") | Gebruikers: " + gebruikers);

		return gebruikers;
	}
	
	/**
	 * Haalt alle studenten op uit het systeem
	 * @return ArrayList<Gebruiker> met Gebruiker objecten van het type 1
	 */
	public ArrayList<Gebruiker> getStudenten() {
		return getGebruikerByType(1);
	}
	
	/**
	 * Haalt een Gebruiker op a.d.v. zijn studentnummer
	 * @param int studentNummer van de Gebruiker
	 * @return gevonden Gebruiker anders null
	 */
	public Gebruiker getGebruikerByStudentnummer(int studentNummer) {
		if (studentNummer == 0) {
			return null;
		}

		Gebruiker g = null;

		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName() + " WHERE studentNummer == " + studentNummer + "";
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();

		if (gebruikers != null && !gebruikers.isEmpty()) {
			g = gebruikers.get(0);
			log.info("getGebruikerByStudentnummer(" + studentNummer + ") | Gebruiker: " + g.toString());
		} else {
			System.out.println("Gebruiker met " + studentNummer + " levert niets op.");
		}

		log.info("getGebruikerByStudentnummer(" + studentNummer + ")");

		return g;
	}
	
	/**
	 * Haalt alle leden van de afstudeercommissie op van een bepaalde faculteit, instituut en opleiding
	 * @param String faculteit
	 * @param String instituut
	 * @param String opleiding
	 * @return ArrayList<Gebruiker> met gevonden objecten
	 */
	public ArrayList<Gebruiker> getLedenAfstudeerCommissieByFaculteitInstituutAndOpleiding(String faculteit, String instituut, String opleiding) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName() + " WHERE type == " + Gebruiker.TYPE_AFSTUDEERCOMMISIE_VOORZITTER + " || type == " + Gebruiker.TYPE_AFSTUDEERCOMMISSIE_LID;
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();
		
		ArrayList<Gebruiker> returnArray = new ArrayList<Gebruiker>();
		for (Gebruiker gebruiker : gebruikers) {
			ArrayList<String> opleidingen = gebruiker.getOpleiding();
			for (String opleidingA : opleidingen) {
				if (opleidingA.equals(opleiding) && gebruiker.getFaculteit().equals(faculteit) && gebruiker.getInstituut().equals(instituut)) {
					returnArray.add(gebruiker);
				}
			}
		}

		log.info("getLedenAfstudeerCommissieByFaculteitInstituutAndOpleiding(" + faculteit + ", " + instituut  + ", " + opleiding + ") | Gebruikers: " + returnArray);

		return returnArray;
	}
	
	/**
	 * Haalt alle studieadviseurs op van een bepaalde faculteit, instituut en opleiding
	 * @param String faculteit
	 * @param String instituut
	 * @param String opleiding
	 * @return ArrayList<Gebruiker> met gevonden objecten
	 */
	public ArrayList<Gebruiker> getStudieAdviseurByFaculteitInstituutAndOpleiding(String faculteit, String instituut, String opleiding) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + Gebruiker.class.getName() + " WHERE type == " + Gebruiker.TYPE_STUDIE_ADVISEUR + " && faculteit == \"" + faculteit + "\" && instituut == \"" + instituut + "\"";
		ArrayList<Gebruiker> gebruikers = new ArrayList<Gebruiker>(pm.detachCopyAll((List<Gebruiker>) pm.newQuery(query).execute()));

		gebruikers.size();
		pm.close();
		
		ArrayList<Gebruiker> returnArray = new ArrayList<Gebruiker>();
		for (Gebruiker gebruiker : gebruikers) {
			ArrayList<String> opleidingen = gebruiker.getOpleiding();
			for (String opleidingA : opleidingen) {
				if (opleidingA.equals(opleiding)) {
					returnArray.add(gebruiker);
				}
			}
		}

		log.info("getStudieAdviseurByFaculteitInstituutAndOpleiding(" + faculteit + ", " + instituut  + ", " + opleiding + ") | Gebruikers: " + returnArray);

		return returnArray;
	}
}
